<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><link rel="stylesheet" type="text/css" href="style.css" /><script type="text/javascript" src="highlight.js"></script></head><body><pre><span class="hs-pragma">{-# LANGUAGE CPP #-}</span><span>
</span><span id="line-2"></span><span class="hs-pragma">{-# LANGUAGE Trustworthy #-}</span><span>
</span><span id="line-3"></span><span class="hs-pragma">{-# LANGUAGE NoImplicitPrelude #-}</span><span>
</span><span id="line-4"></span><span class="hs-pragma">{-# LANGUAGE MagicHash #-}</span><span>
</span><span id="line-5"></span><span class="hs-pragma">{-# LANGUAGE UnboxedTuples #-}</span><span>
</span><span id="line-6"></span><span class="hs-pragma">{-# LANGUAGE DataKinds #-}</span><span>
</span><span id="line-7"></span><span class="hs-pragma">{-# LANGUAGE PolyKinds #-}</span><span>
</span><span id="line-8"></span><span class="hs-pragma">{-# LANGUAGE ScopedTypeVariables #-}</span><span>
</span><span id="line-9"></span><span>
</span><span id="line-10"></span><span class="hs-comment">-----------------------------------------------------------------------------</span><span>
</span><span id="line-11"></span><span class="hs-comment">-- |</span><span>
</span><span id="line-12"></span><span class="hs-comment">-- Module      :  GHC.Magic</span><span>
</span><span id="line-13"></span><span class="hs-comment">-- Copyright   :  (c) The University of Glasgow 2009</span><span>
</span><span id="line-14"></span><span class="hs-comment">-- License     :  see libraries/ghc-prim/LICENSE</span><span>
</span><span id="line-15"></span><span class="hs-comment">--</span><span>
</span><span id="line-16"></span><span class="hs-comment">-- Maintainer  :  cvs-ghc@haskell.org</span><span>
</span><span id="line-17"></span><span class="hs-comment">-- Stability   :  internal</span><span>
</span><span id="line-18"></span><span class="hs-comment">-- Portability :  non-portable (GHC Extensions)</span><span>
</span><span id="line-19"></span><span class="hs-comment">--</span><span>
</span><span id="line-20"></span><span class="hs-comment">-- GHC magic.</span><span>
</span><span id="line-21"></span><span class="hs-comment">--</span><span>
</span><span id="line-22"></span><span class="hs-comment">-- Use GHC.Exts from the base package instead of importing this</span><span>
</span><span id="line-23"></span><span class="hs-comment">-- module directly.</span><span>
</span><span id="line-24"></span><span class="hs-comment">--</span><span>
</span><span id="line-25"></span><span class="hs-comment">-----------------------------------------------------------------------------</span><span>
</span><span id="line-26"></span><span>
</span><span id="line-27"></span><span class="hs-keyword">module</span><span> </span><span class="hs-identifier">GHC.Magic</span><span> </span><span class="hs-special">(</span><span> </span><span class="annot"><a href="GHC.Magic.html#inline"><span class="hs-identifier">inline</span></a></span><span class="hs-special">,</span><span> </span><span class="annot"><a href="GHC.Magic.html#noinline"><span class="hs-identifier">noinline</span></a></span><span class="hs-special">,</span><span> </span><span class="annot"><a href="GHC.Magic.html#lazy"><span class="hs-identifier">lazy</span></a></span><span class="hs-special">,</span><span> </span><span class="annot"><a href="GHC.Magic.html#oneShot"><span class="hs-identifier">oneShot</span></a></span><span class="hs-special">,</span><span> </span><span class="annot"><a href="GHC.Magic.html#runRW%23"><span class="hs-identifier">runRW#</span></a></span><span> </span><span class="hs-special">)</span><span> </span><span class="hs-keyword">where</span><span>
</span><span id="line-28"></span><span>
</span><span id="line-29"></span><span class="hs-comment">--------------------------------------------------</span><span>
</span><span id="line-30"></span><span class="hs-comment">--        See Note [magicIds] in GHC.Types.Id.Make</span><span>
</span><span id="line-31"></span><span class="hs-comment">--------------------------------------------------</span><span>
</span><span id="line-32"></span><span>
</span><span id="line-33"></span><span class="hs-comment">-- Here import TYPE explicitly from GHC.Types and not from GHC.Prim. This is</span><span>
</span><span id="line-34"></span><span class="hs-comment">-- because TYPE is not exported by the source Haskell module generated by</span><span>
</span><span id="line-35"></span><span class="hs-comment">-- genprimops which Haddock will typecheck.</span><span>
</span><span id="line-36"></span><span class="hs-comment">-- Likewise, realWorld# is not generated by genprimops so we use CPP and only</span><span>
</span><span id="line-37"></span><span class="hs-comment">-- import/use it when not building haddock docs.</span><span class="hs-cpp">
#if !defined(__HADDOCK_VERSION__)
</span><span class="hs-keyword">import</span><span> </span><span class="hs-identifier">GHC.Prim</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">realWorld#</span><span class="hs-special">)</span><span class="hs-cpp">
#endif
</span><span class="hs-keyword">import</span><span> </span><span class="annot"><a href="GHC.Prim.html"><span class="hs-identifier">GHC.Prim</span></a></span><span> </span><span class="hs-special">(</span><span class="annot"><a href="GHC.Prim.html#State%23"><span class="hs-identifier">State#</span></a></span><span class="hs-special">,</span><span> </span><span class="annot"><a href="GHC.Prim.html#RealWorld"><span class="hs-identifier">RealWorld</span></a></span><span class="hs-special">)</span><span>
</span><span id="line-42"></span><span class="hs-keyword">import</span><span> </span><span class="annot"><a href="GHC.Types.html"><span class="hs-identifier">GHC.Types</span></a></span><span> </span><span class="hs-special">(</span><span class="annot"><a href="GHC.Types.html#RuntimeRep"><span class="hs-identifier">RuntimeRep</span></a></span><span class="hs-special">,</span><span> </span><span class="annot"><a href="GHC.Prim.html#TYPE"><span class="hs-identifier">TYPE</span></a></span><span class="hs-special">)</span><span>
</span><span id="line-43"></span><span>
</span><span id="line-44"></span><span class="hs-comment">-- | The call @inline f@ arranges that @f@ is inlined, regardless of</span><span>
</span><span id="line-45"></span><span class="hs-comment">-- its size. More precisely, the call @inline f@ rewrites to the</span><span>
</span><span id="line-46"></span><span class="hs-comment">-- right-hand side of @f@'s definition. This allows the programmer to</span><span>
</span><span id="line-47"></span><span class="hs-comment">-- control inlining from a particular call site rather than the</span><span>
</span><span id="line-48"></span><span class="hs-comment">-- definition site of the function (c.f. @INLINE@ pragmas).</span><span>
</span><span id="line-49"></span><span class="hs-comment">--</span><span>
</span><span id="line-50"></span><span class="hs-comment">-- This inlining occurs regardless of the argument to the call or the</span><span>
</span><span id="line-51"></span><span class="hs-comment">-- size of @f@'s definition; it is unconditional. The main caveat is</span><span>
</span><span id="line-52"></span><span class="hs-comment">-- that @f@'s definition must be visible to the compiler; it is</span><span>
</span><span id="line-53"></span><span class="hs-comment">-- therefore recommended to mark the function with an @INLINABLE@</span><span>
</span><span id="line-54"></span><span class="hs-comment">-- pragma at its definition so that GHC guarantees to record its</span><span>
</span><span id="line-55"></span><span class="hs-comment">-- unfolding regardless of size.</span><span>
</span><span id="line-56"></span><span class="hs-comment">--</span><span>
</span><span id="line-57"></span><span class="hs-comment">-- If no inlining takes place, the 'inline' function expands to the</span><span>
</span><span id="line-58"></span><span class="hs-comment">-- identity function in Phase zero, so its use imposes no overhead.</span><span>
</span><span id="line-59"></span><span class="hs-pragma">{-# NOINLINE</span><span class="hs-pragma">[</span><span class="hs-pragma">0</span><span class="hs-pragma">]</span><span> </span><span class="annot"><a href="GHC.Magic.html#inline"><span class="hs-pragma hs-type">inline</span></a></span><span> </span><span class="hs-pragma">#-}</span><span>
</span><span id="line-60"></span><span id="local-6989586621679074123"><span class="annot"><a href="GHC.Magic.html#inline"><span class="hs-identifier hs-type">inline</span></a></span><span> </span><span class="hs-glyph">::</span><span> </span><span class="annot"><a href="#local-6989586621679074123"><span class="hs-identifier hs-type">a</span></a></span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="annot"><a href="#local-6989586621679074123"><span class="hs-identifier hs-type">a</span></a></span></span><span>
</span><span id="line-61"></span><span id="inline"><span class="annot"><span class="annottext">inline :: forall a. a -&gt; a
</span><a href="GHC.Magic.html#inline"><span class="hs-identifier hs-var hs-var">inline</span></a></span></span><span> </span><span id="local-6989586621679074110"><span class="annot"><span class="annottext">a
</span><a href="#local-6989586621679074110"><span class="hs-identifier hs-var">x</span></a></span></span><span> </span><span class="hs-glyph">=</span><span> </span><span class="annot"><span class="annottext">a
</span><a href="#local-6989586621679074110"><span class="hs-identifier hs-var">x</span></a></span><span>
</span><span id="line-62"></span><span>
</span><span id="line-63"></span><span class="hs-comment">-- | The call @noinline f@ arranges that @f@ will not be inlined.</span><span>
</span><span id="line-64"></span><span class="hs-comment">-- It is removed during CorePrep so that its use imposes no overhead</span><span>
</span><span id="line-65"></span><span class="hs-comment">-- (besides the fact that it blocks inlining.)</span><span>
</span><span id="line-66"></span><span class="hs-pragma">{-# NOINLINE</span><span> </span><span class="annot"><a href="GHC.Magic.html#noinline"><span class="hs-pragma hs-type">noinline</span></a></span><span> </span><span class="hs-pragma">#-}</span><span>
</span><span id="line-67"></span><span id="local-6989586621679074109"><span class="annot"><a href="GHC.Magic.html#noinline"><span class="hs-identifier hs-type">noinline</span></a></span><span> </span><span class="hs-glyph">::</span><span> </span><span class="annot"><a href="#local-6989586621679074109"><span class="hs-identifier hs-type">a</span></a></span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="annot"><a href="#local-6989586621679074109"><span class="hs-identifier hs-type">a</span></a></span></span><span>
</span><span id="line-68"></span><span id="noinline"><span class="annot"><span class="annottext">noinline :: forall a. a -&gt; a
</span><a href="GHC.Magic.html#noinline"><span class="hs-identifier hs-var hs-var">noinline</span></a></span></span><span> </span><span id="local-6989586621679074108"><span class="annot"><span class="annottext">a
</span><a href="#local-6989586621679074108"><span class="hs-identifier hs-var">x</span></a></span></span><span> </span><span class="hs-glyph">=</span><span> </span><span class="annot"><span class="annottext">a
</span><a href="#local-6989586621679074108"><span class="hs-identifier hs-var">x</span></a></span><span>
</span><span id="line-69"></span><span>
</span><span id="line-70"></span><span class="hs-comment">-- | The 'lazy' function restrains strictness analysis a little. The</span><span>
</span><span id="line-71"></span><span class="hs-comment">-- call @lazy e@ means the same as @e@, but 'lazy' has a magical</span><span>
</span><span id="line-72"></span><span class="hs-comment">-- property so far as strictness analysis is concerned: it is lazy in</span><span>
</span><span id="line-73"></span><span class="hs-comment">-- its first argument, even though its semantics is strict. After</span><span>
</span><span id="line-74"></span><span class="hs-comment">-- strictness analysis has run, calls to 'lazy' are inlined to be the</span><span>
</span><span id="line-75"></span><span class="hs-comment">-- identity function.</span><span>
</span><span id="line-76"></span><span class="hs-comment">--</span><span>
</span><span id="line-77"></span><span class="hs-comment">-- This behaviour is occasionally useful when controlling evaluation</span><span>
</span><span id="line-78"></span><span class="hs-comment">-- order. Notably, 'lazy' is used in the library definition of</span><span>
</span><span id="line-79"></span><span class="hs-comment">-- 'Control.Parallel.par':</span><span>
</span><span id="line-80"></span><span class="hs-comment">--</span><span>
</span><span id="line-81"></span><span class="hs-comment">-- &gt; par :: a -&gt; b -&gt; b</span><span>
</span><span id="line-82"></span><span class="hs-comment">-- &gt; par x y = case (par# x) of _ -&gt; lazy y</span><span>
</span><span id="line-83"></span><span class="hs-comment">--</span><span>
</span><span id="line-84"></span><span class="hs-comment">-- If 'lazy' were not lazy, 'Control.Parallel.par' would look strict in</span><span>
</span><span id="line-85"></span><span class="hs-comment">-- @y@ which would defeat the whole purpose of 'Control.Parallel.par'.</span><span>
</span><span id="line-86"></span><span class="hs-comment">--</span><span>
</span><span id="line-87"></span><span class="hs-comment">-- Like 'seq', the argument of 'lazy' can have an unboxed type.</span><span>
</span><span id="line-88"></span><span id="local-6989586621679074107"><span class="annot"><a href="GHC.Magic.html#lazy"><span class="hs-identifier hs-type">lazy</span></a></span><span> </span><span class="hs-glyph">::</span><span> </span><span class="annot"><a href="#local-6989586621679074107"><span class="hs-identifier hs-type">a</span></a></span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="annot"><a href="#local-6989586621679074107"><span class="hs-identifier hs-type">a</span></a></span></span><span>
</span><span id="line-89"></span><span id="lazy"><span class="annot"><span class="annottext">lazy :: forall a. a -&gt; a
</span><a href="GHC.Magic.html#lazy"><span class="hs-identifier hs-var hs-var">lazy</span></a></span></span><span> </span><span id="local-6989586621679074106"><span class="annot"><span class="annottext">a
</span><a href="#local-6989586621679074106"><span class="hs-identifier hs-var">x</span></a></span></span><span> </span><span class="hs-glyph">=</span><span> </span><span class="annot"><span class="annottext">a
</span><a href="#local-6989586621679074106"><span class="hs-identifier hs-var">x</span></a></span><span>
</span><span id="line-90"></span><span class="hs-comment">-- Implementation note: its strictness and unfolding are over-ridden</span><span>
</span><span id="line-91"></span><span class="hs-comment">-- by the definition in GHC.Types.Id.Make; in both cases to nothing at all.</span><span>
</span><span id="line-92"></span><span class="hs-comment">-- That way, 'lazy' does not get inlined, and the strictness analyser</span><span>
</span><span id="line-93"></span><span class="hs-comment">-- sees it as lazy.  Then the worker/wrapper phase inlines it.</span><span>
</span><span id="line-94"></span><span class="hs-comment">-- Result: happiness</span><span>
</span><span id="line-95"></span><span>
</span><span id="line-96"></span><span>
</span><span id="line-97"></span><span class="hs-comment">-- | The 'oneShot' function can be used to give a hint to the compiler that its</span><span>
</span><span id="line-98"></span><span class="hs-comment">-- argument will be called at most once, which may (or may not) enable certain</span><span>
</span><span id="line-99"></span><span class="hs-comment">-- optimizations. It can be useful to improve the performance of code in continuation</span><span>
</span><span id="line-100"></span><span class="hs-comment">-- passing style.</span><span>
</span><span id="line-101"></span><span class="hs-comment">--</span><span>
</span><span id="line-102"></span><span class="hs-comment">-- If 'oneShot' is used wrongly, then it may be that computations whose result</span><span>
</span><span id="line-103"></span><span class="hs-comment">-- that would otherwise be shared are re-evaluated every time they are used. Otherwise,</span><span>
</span><span id="line-104"></span><span class="hs-comment">-- the use of `oneShot` is safe.</span><span>
</span><span id="line-105"></span><span class="hs-comment">--</span><span>
</span><span id="line-106"></span><span class="hs-comment">-- 'oneShot' is representation polymorphic: the type variables may refer to lifted</span><span>
</span><span id="line-107"></span><span class="hs-comment">-- or unlifted types.</span><span>
</span><span id="line-108"></span><span class="annot"><a href="GHC.Magic.html#oneShot"><span class="hs-identifier hs-type">oneShot</span></a></span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-keyword">forall</span><span> </span><span class="hs-special">(</span><span id="local-6989586621679074119"><span class="annot"><a href="#local-6989586621679074119"><span class="hs-identifier hs-type">q</span></a></span></span><span> </span><span class="hs-glyph">::</span><span> </span><span class="annot"><a href="GHC.Types.html#RuntimeRep"><span class="hs-identifier hs-type">RuntimeRep</span></a></span><span class="hs-special">)</span><span> </span><span class="hs-special">(</span><span id="local-6989586621679074118"><span class="annot"><a href="#local-6989586621679074118"><span class="hs-identifier hs-type">r</span></a></span></span><span> </span><span class="hs-glyph">::</span><span> </span><span class="annot"><a href="GHC.Types.html#RuntimeRep"><span class="hs-identifier hs-type">RuntimeRep</span></a></span><span class="hs-special">)</span><span>
</span><span id="line-109"></span><span>                  </span><span class="hs-special">(</span><span id="local-6989586621679074117"><span class="annot"><a href="#local-6989586621679074117"><span class="hs-identifier hs-type">a</span></a></span></span><span> </span><span class="hs-glyph">::</span><span> </span><span class="annot"><a href="GHC.Prim.html#TYPE"><span class="hs-identifier hs-type">TYPE</span></a></span><span> </span><span class="annot"><a href="#local-6989586621679074119"><span class="hs-identifier hs-type">q</span></a></span><span class="hs-special">)</span><span> </span><span class="hs-special">(</span><span id="local-6989586621679074116"><span class="annot"><a href="#local-6989586621679074116"><span class="hs-identifier hs-type">b</span></a></span></span><span> </span><span class="hs-glyph">::</span><span> </span><span class="annot"><a href="GHC.Prim.html#TYPE"><span class="hs-identifier hs-type">TYPE</span></a></span><span> </span><span class="annot"><a href="#local-6989586621679074118"><span class="hs-identifier hs-type">r</span></a></span><span class="hs-special">)</span><span class="hs-operator">.</span><span>
</span><span id="line-110"></span><span>           </span><span class="hs-special">(</span><span class="annot"><a href="#local-6989586621679074117"><span class="hs-identifier hs-type">a</span></a></span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="annot"><a href="#local-6989586621679074116"><span class="hs-identifier hs-type">b</span></a></span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="annot"><a href="#local-6989586621679074117"><span class="hs-identifier hs-type">a</span></a></span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="annot"><a href="#local-6989586621679074116"><span class="hs-identifier hs-type">b</span></a></span><span>
</span><span id="line-111"></span><span id="oneShot"><span class="annot"><span class="annottext">oneShot :: forall a b. (a -&gt; b) -&gt; a -&gt; b
</span><a href="GHC.Magic.html#oneShot"><span class="hs-identifier hs-var hs-var">oneShot</span></a></span></span><span> </span><span id="local-6989586621679074105"><span class="annot"><span class="annottext">a -&gt; b
</span><a href="#local-6989586621679074105"><span class="hs-identifier hs-var">f</span></a></span></span><span> </span><span class="hs-glyph">=</span><span> </span><span class="annot"><span class="annottext">a -&gt; b
</span><a href="#local-6989586621679074105"><span class="hs-identifier hs-var">f</span></a></span><span>
</span><span id="line-112"></span><span class="hs-comment">-- Implementation note: This is wired in in GHC.Types.Id.Make, so the code here is</span><span>
</span><span id="line-113"></span><span class="hs-comment">-- mostly there to have a place for the documentation.</span><span>
</span><span id="line-114"></span><span>
</span><span id="line-115"></span><span class="hs-comment">-- | Apply a function to a @'State#' 'RealWorld'@ token. When manually applying</span><span>
</span><span id="line-116"></span><span class="hs-comment">-- a function to `realWorld#`, it is necessary to use @NOINLINE@ to prevent</span><span>
</span><span id="line-117"></span><span class="hs-comment">-- semantically undesirable floating. `runRW#` is inlined, but only very late</span><span>
</span><span id="line-118"></span><span class="hs-comment">-- in compilation after all floating is complete.</span><span>
</span><span id="line-119"></span><span>
</span><span id="line-120"></span><span class="hs-comment">-- 'runRW#' is representation polymorphic: the result may have a lifted or</span><span>
</span><span id="line-121"></span><span class="hs-comment">-- unlifted type.</span><span>
</span><span id="line-122"></span><span>
</span><span id="line-123"></span><span class="annot"><a href="GHC.Magic.html#runRW%23"><span class="hs-identifier hs-type">runRW#</span></a></span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-keyword">forall</span><span> </span><span class="hs-special">(</span><span id="local-6989586621679074113"><span class="annot"><a href="#local-6989586621679074113"><span class="hs-identifier hs-type">r</span></a></span></span><span> </span><span class="hs-glyph">::</span><span> </span><span class="annot"><a href="GHC.Types.html#RuntimeRep"><span class="hs-identifier hs-type">RuntimeRep</span></a></span><span class="hs-special">)</span><span> </span><span class="hs-special">(</span><span id="local-6989586621679074112"><span class="annot"><a href="#local-6989586621679074112"><span class="hs-identifier hs-type">o</span></a></span></span><span> </span><span class="hs-glyph">::</span><span> </span><span class="annot"><a href="GHC.Prim.html#TYPE"><span class="hs-identifier hs-type">TYPE</span></a></span><span> </span><span class="annot"><a href="#local-6989586621679074113"><span class="hs-identifier hs-type">r</span></a></span><span class="hs-special">)</span><span class="hs-operator">.</span><span>
</span><span id="line-124"></span><span>          </span><span class="hs-special">(</span><span class="annot"><a href="GHC.Prim.html#State%23"><span class="hs-identifier hs-type">State#</span></a></span><span> </span><span class="annot"><a href="GHC.Prim.html#RealWorld"><span class="hs-identifier hs-type">RealWorld</span></a></span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="annot"><a href="#local-6989586621679074112"><span class="hs-identifier hs-type">o</span></a></span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="annot"><a href="#local-6989586621679074112"><span class="hs-identifier hs-type">o</span></a></span><span>
</span><span id="line-125"></span><span class="hs-comment">-- See Note [runRW magic] in GHC.CoreToStg.Prep.</span><span>
</span><span id="line-126"></span><span class="hs-pragma">{-# NOINLINE</span><span> </span><span class="annot"><a href="GHC.Magic.html#runRW%23"><span class="hs-pragma hs-type">runRW#</span></a></span><span> </span><span class="hs-pragma">#-}</span><span>  </span><span class="hs-comment">-- runRW# is inlined manually in CorePrep</span><span class="hs-cpp">
#if !defined(__HADDOCK_VERSION__)
</span><span class="hs-identifier">runRW#</span><span> </span><span class="hs-identifier">m</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier">m</span><span> </span><span class="hs-identifier">realWorld#</span><span class="hs-cpp">
#else
</span><span id="runRW%23"><span class="annot"><span class="annottext">runRW# :: forall o. (State# RealWorld -&gt; o) -&gt; o
</span><a href="GHC.Magic.html#runRW%23"><span class="hs-identifier hs-var hs-var">runRW#</span></a></span></span><span> </span><span class="hs-glyph">=</span><span> </span><span class="annot"><span class="annottext">(State# RealWorld -&gt; o) -&gt; o
forall o. (State# RealWorld -&gt; o) -&gt; o
</span><a href="GHC.Magic.html#runRW%23"><span class="hs-identifier hs-var">runRW#</span></a></span><span>   </span><span class="hs-comment">-- The realWorld# is too much for haddock</span><span class="hs-cpp">
#endif
</span></pre></body></html>